#课堂练习
import pygame,sys,random
from pygame.locals import *

class MyBallClass(pygame.sprite.Sprite):
    def __init__(self,image_file,speed,location):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(image_file)
        self.rect=self.image.get_rect()
        self.rect.left,self.rect.top=location
        self.speed=speed

    def move(self):
        global points,score_text
        self.rect=self.rect.move(self.speed)
        if self.rect.left<0 or self.rect.right>screen.get_width():
            self.speed[0]=-self.speed[0]
            if self.rect.top<screen.get_height():
                hit_wall.play() #撞到左右的墙是播放撞墙声音
            
        if self.rect.top<=0:
            self.speed[1]=-self.speed[1]
            points=points+1
            score_text=font.render(str(points),1,(0,0,0))
            get_point.play()    #撞到顶部时播放得分声音

        if self.rect.top>=screen.get_rect().bottom:
            global done 
            global lives

            if not done:
                splat.play()
           
            lives=lives-1
            if lives<=0:  
                if not done:
                    pygame.time.delay(1000)
                    bye.play()  #游戏结束播放声音
                final_text1="Game Over"
                final_text2="Your final score is:"+str(points)
                ft1_font=pygame.font.Font(None,70)
                ft1_surf=font.render(final_text1,1,(0,0,0))
                ft2_font=pygame.font.Font(None,50)
                ft2_surf=font.render(final_text2,1,(0,0,0))
                screen.blit(ft1_surf,[screen.get_width()/2-ft1_surf.get_width()/2,100])
                screen.blit(ft2_surf,[screen.get_width()/2-ft2_surf.get_width()/2,200])
                pygame.display.flip()
                done=True
                pygame.mixer.music.fadeout(2000)
            else:
                pygame.time.delay(1000)
                new_life.play()     #开始一个新的生命时播放声音
                self.rect.topleft=[(screen.get_rect().width)-40*lives,20]


class MyPaddleClass(pygame.sprite.Sprite):
    def __init__(self,location=[0,0]):
        pygame.sprite.Sprite.__init__(self)
        image_surface=pygame.surface.Surface([100,20])
        image_surface.fill([0,0,0])
        self.image=image_surface.convert()
        self.rect=self.image.get_rect()
        self.rect.left,self.rect.top=location

pygame.init()
size=width,height=640,480
screen=pygame.display.set_mode(size)
clock=pygame.time.Clock()
ball_speed=[random.randint(3,10),random.randint(2,6)]
myBall=MyBallClass('Image\\wackyball.bmp',ball_speed,[random.randint(12,51),random.randint(6,51)])
ballGroup=pygame.sprite.Group(myBall)
paddle=MyPaddleClass([270,400])

font=pygame.font.Font(None,50)
points=0
score_text=font.render(str(points),1,(0,0,0))
textpos=[10,10]

lives=3
done=False
pygame.mixer.init()
#声音
hit=pygame.mixer.Sound("sounds\\hit_paddle.wav")
hit.set_volume(0.4)

hit_wall=pygame.mixer.Sound("sounds\\hit_wall.wav")
hit_wall.set_volume(0.4)
get_point=pygame.mixer.Sound('sounds\\get_point.wav')
get_point.set_volume(0.2)
splat=pygame.mixer.Sound('sounds\\splat.wav')
splat.set_volume(0.6)
new_life=pygame.mixer.Sound('sounds\\new_life.wav')
new_life.set_volume(0.5)
bye=pygame.mixer.Sound('sounds\\game_over.wav')
bye.set_volume(0.6)

pygame.mixer.music.load('sounds\\bg_music.mp3')
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1)

while True:
    clock.tick(60) 
    screen.fill([255,255,255])
    screen.blit(score_text,textpos)
    for i in range(lives):
        width=screen.get_rect().width
        screen.blit(myBall.image,[width-40*i,20])
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

        if event.type==pygame.MOUSEMOTION:
            paddle.rect.centerx=event.pos[0]

    if pygame.sprite.spritecollide(paddle,ballGroup,False):
        myBall.speed[1]=-myBall.speed[1]
        hit.set_volume(0.4)
        hit.play()
    myBall.move()
    if not done:
        screen.blit(myBall.image,myBall.rect)
        screen.blit(paddle.image,paddle.rect)
        screen.blit(score_text,textpos)
        for i in range(lives):
            widht=screen.get_width()
            screen.blit(myBall.image,[width-40*i,20])
        pygame.display.flip()
    

    pygame.display.flip()